package com.rz.htk.product.service;

import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rz.htk.order.entity.Order;
import com.rz.htk.product.entity.Product;
import com.rz.htk.product.entity.ProductPrice;
import com.rz.htk.product.entity.vo.PrdDeleteParam;
import com.rz.htk.product.entity.vo.PrdPriceParam;
import consumer.model.Zone;

import java.util.List;

/**
 * @ClassName IProductPriceService
 * @Description 产品资费信息
 * @Author maweiyue
 * @Date 2019/3/26 20:40
 */
public interface IProductPriceService extends IService<ProductPrice> {

    IPage<ProductPrice> getPage(ProductPrice product);

    boolean saveProductPrice(ProductPrice product);

    boolean batchDelete(PrdDeleteParam prdDeleteParam);

    /**
     * 根据“路向”获取指定产品的资费信息
     * @param prdCode      产品编号
     * @param destination  路向
     * @return
     */
    List<ProductPrice> listProductPriceByDestination(String prdCode, String destination);

    /**
     * 根据“国家”“产品”获取资费信息
     * @param prdCode      产品编号
     * @param country  国家2字符简码
     * @return
     */
    List<ProductPrice> getDestination(String prdCode, String country);

    /**
     * 根据产品编号获取产品资费信息列表
     * @param prdCode 产品编号
     * @return
     */
    List<ProductPrice> listProductPriceByPrdcode(String prdCode);

    /**
     * 根据国家代码获取产品资费列表
     * @param code
     * @return
     */
    List<ProductPrice> listProductPriceByCountry(String code);

    /**
     * 根据国家代码和包裹类型获取资费信息列表
     * @param countryCode 国家代码
     * @param packageType 包裹类型
     * @return
     */
    List<ProductPrice> listProductPriceByCountryAndPackageType(String countryCode, String packageType);

    /**
     * 根据产品编码、目的地国家代码、包裹重量获取产品资费列表
     * @param prdCode
     * @param contry
     * @param weight
     * @return
     */
    List<ProductPrice> listProductPrice(String prdCode, String contry, Double weight);

    /**
     * 根据产品编码、目的地国家代码、包裹重量、邮政分区获取产品资费列表
     * @param prdCode
     * @param contry
     * @param weight
     * @param zone   邮政分区号（例如美国分为1-9区）
     * @return
     */
    List<ProductPrice> listProductPrice(String prdCode, String contry, Double weight, String zone);

    /**
     * 根据产品编码、目的地国家代码、包裹体积、邮政分区获取产品资费列表
     * @param prdCode
     * @param contry
     * @param volume
     * @param zone   邮政分区号（例如美国分为1-9区）
     * @return
     */
    List<ProductPrice> listProductPriceByVolume(String prdCode, String contry, Double volume, String zone);

    /**
     * 根据订单信息获取最优资费标准
     * @param order 订单信息
     * @return
     */
    ProductPrice getBestProductPrice(Order order);

    /**
     * 查询一个订单发到哪个中转“仓库”最优。比如发往美国的快递，美国有两个中转仓库，就需要根据快递的目的地邮编查询从哪个仓库走更省钱
     * @param order 订单信息
     * @return Zone(Zone中包含中转仓库的邮编，由此可获得中转仓库信息)
     */
    Zone selectBestZone(Order order);


    /**
     * 报价
     * @param order 订单信息
     * @return
     */
    double quote(Order order);

    /**
     * 报价
     * @param param 报价查询条件
     * @return
     */
    JSONArray quote(PrdPriceParam param);

    /**
     * 获取路向名称
     * @param product  产品实体bean
     * @param productPrice  产品资费信息bean
     * @return
     */
    String getProductPriceName (Product product, ProductPrice productPrice);
}
